A data storage system environment typically includes one or more host computing devices (“hosts”) in communication with one or more storage arrays. A host typically executes an application program (e.g., a database application) which requires data associated with the application to be stored locally (i.e., on the host), remotely (i.e., on one of the storage arrays), or stored both locally and remotely. The host typically includes memory devices that provide both volatile random-access memory capacity (e.g., dynamic random-access memory (DRAM)) and non-volatile random-access memory capacity (e.g., flash memory devices). The storage array typically includes storage devices that provide non-volatile random-access storage capacity (e.g., flash memory devices) and non-volatile large storage capacity (e.g., hard disk drives (HDDs) and tape drives). In general, random-access memory is used to satisfy high throughput and/or bandwidth requirements of a given application program while the hard disk and tape drives are used to satisfy capacity requirements.
In a data storage environment, the ability to define multiple, independent memory tiers is desirable. A memory tier is typically constructed by memory mapping a region of a storage class memory (SCM) device or a region of an array storage device into a process's virtual address space. A memory-mapped region may be fronted by a DRAM page cache to which an application issues loads and stores. The memory tiering mechanism moves data between the SCM or array device and the DRAM page cache on an on-demand basis. In addition, a processor may utilize a memory cache (also referred to as a “CPU cache”) to reduce the average time to access data from a main memory. It is known to provide multiple independent CPU caches, including instruction and data caches, where the data cache is typically organized as a hierarchy of more cache levels (L1, L2 etc.). It is desirable to continually improve the performance of computer systems that utilize significant amounts of memory.